<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="../rurple.css" type="text/css" />
<title>46. Brüche - Teil 3</title>
</head>
<body>
<h2 class="title">46. Brüche - Teil 3</h2>
<p>Hast du die überflüssige Quelltextzeile in der vorherigen Lektion gefunden?
Falls nicht: es ist Zeile 22. Da stand die Anweisung <tt>kuerzen()</tt> vor
der Rückgabe eines neuen <tt>Bruch</tt>-Objekts. Aber wenn wir <tt>Bruch()</tt>
aufrufen, wird bei der Initialisierung ebenfalls <tt>kuerzen()</tt> aufgerufen
(Zeile 10). Wir behalten Zeile 10, da sie das geforderte Ergebnis für unseren
Test in Zeile 43 liefert; so dass wir den Aufruf von <tt>kuerzen()</tt> in Zeile
22 weglassen können.</p>
<p>Jetzt sind wir bereit, eine Methode für die Division (Teilen) hinzuzufügen.
Um einen Bruche durch einen anderen zu teilen, multiplizieren wir den ersten
Bruch mit dem <i>Kehrwert</i> des zweiten, etwa so:</p>
<pre>
1   3     1   4     4     2
- / -  =  - * -  =  -  =  -
2   4     2   3     6     3
</pre>
<p>Multipliziert man eine Zahl mit ihrem Kehrwert, ist das Ergebnis immer 1. Man
erhält den Kehrwert durch Vertauschen von Zähler und Nenner. Bei ganzen Zahlen
nimmt man als Nenner 1; zum Beispiel ist der Kehrwert von 3 1/3. Schauen wir
mal, wie wir das mit Python machen können.</p>
<!--=============================================-->
<hr class="line" />
<h3 class="section">Einen Bruch durch einen anderen dividieren</h3>
<p>Damit Python das Symbol "<tt>/</tt>" mit einer Rechenvorschrift zum Teilen
zweier Brüche verbindet, definieren wir diese Rechenvorschrift in der Methode
<tt>__div__()</tt>. Hier sind die maßgeblichen Zeilen unseres neuen Quelltextes
(rot markiert):
</p>
<pre>
<span class='linenumber'>  8 </span><span class=
'keyword'>class</span> Bruch(object):
<span class='linenumber'>  9 </span>    <span class=
'keyword'>def</span> __init__(self, zaehler, nenner=<span class=
'number'>1</span>):
<span class=
'linenumber'> 10 </span>        zaehler, nenner = self.kuerzen(zaehler, nenner)
<span class='linenumber'> 11 </span>        self.zaehler = zaehler
<span class='linenumber'> 12 </span>        self.nenner = nenner

<span class='newlinenumber'> 24 </span>    <span class=
'keyword'>def</span> __div__(self, operand):
<span class='newlinenumber'> 25 </span>        zaehler = self.zaehler * operand.nenner
<span class='newlinenumber'> 26 </span>        nenner = self.nenner * operand.zaehler
<span class='newlinenumber'> 27 </span><span class=
'keyword'>        return</span> Bruch(zaehler, nenner)

<span class='linenumber'> 38 </span><span class=
'keyword'>if</span> __name__ ==<span class='string'> "__main__"</span>:
<span class='linenumber'> 39 </span>    a = Bruch(<span class=
'number'>1</span>,<span class='number'> 2</span>)
<span class='linenumber'> 40 </span>    b = Bruch(<span class=
'number'>3</span>,<span class='number'> 1</span>)
<span class='linenumber'> 41 </span><span class=
'keyword'>    assert</span> str(a) ==<span class='string'> "(1/2)"</span>
<span class='linenumber'> 42 </span><span class=
'keyword'>    assert</span> str(b) ==<span class='string'> "(3)"</span>
<span class='linenumber'> 43 </span><span class=
'keyword'>    assert</span> str(a*b) ==<span class='string'> "(3/2)"</span>
<span class='linenumber'> 44 </span>    c = Bruch(<span class=
'number'>1</span>,<span class='number'> 3</span>)
<span class='linenumber'> 45 </span><span class=
'keyword'>    assert</span> str(b*c) ==<span class='string'> "(1)"</span>
<span class='linenumber'> 46 </span>    d = Bruch(<span class=
'number'>5</span>,<span class='number'> 10</span>)
<span class='linenumber'> 47 </span><span class=
'keyword'>    assert</span> str(d) ==<span class='string'> "(1/2)"</span>
<span class='newlinenumber'> 48 </span><span class=
'keyword'>    print</span> a/b
<span class='newlinenumber'> 49 </span><span class=
'keyword'>    print</span> a/a
</pre>
<p>Die Ergebnisse lauten</p>
<pre>
(1/6)
(1)
</pre>
<p>wie gewünscht. Jetzt bleibt nur noch, die 
<span class="pykeyword">print</span>-Anweisungen (Zeilen 48 und 49) durch
<span class="pykeyword">assert</span>-Anweisungen zu ersetzen, dann können wir
weitermachen.</p>
<!--=============================================-->
<hr class="line" />
<h3 class="section">Addieren und Subtrahieren</h3>
<p>Als Nächstes steht Addieren und Subtrahieren auf unserer Liste. Wir beginnen
mit der Addition. Aber diesmal gehen wir anders vor: zuerst formulieren wir mit
<span class="pykeyword">assert</span> die Ergebnisse, die wir erwarten würden,
wenn wir mit Python schon addieren könnten. Natürlich lösen die <span class=
"pykeyword">assert</span>-Anweisungen eine Ausnahme aus und das Programm wird
abgebrochen. Dann schreiben wir den Quelltext, den wir brauchen, um die Tests
lauffähig zu machen.</p>
<p> Diese Vorgehensweise ist als <i>Test Driven Development</i> bekannt, kurz
TDD, deutsch <i>Testgetriebene Entwicklung</i>. Das ist eine moderne Art,
Programme zu schreiben, die immer beliebter wird, weil sie wirklich hilft, Bugs
zu vermeiden.</p>
<pre>
<span class='linenumber'> 38 </span><span class=
'keyword'>if</span> __name__ ==<span class='string'> "__main__"</span>:
<span class='linenumber'> 39 </span>    a = Bruch(<span class=
'number'>1</span>,<span class='number'> 2</span>)
<span class='linenumber'> 40 </span>    b = Bruch(<span class=
'number'>3</span>,<span class='number'> 1</span>)
<span class='linenumber'> 41 </span><span class=
'keyword'>    assert</span> str(a) ==<span class='string'> "(1/2)"</span>
<span class='linenumber'> 42 </span><span class=
'keyword'>    assert</span> str(b) ==<span class='string'> "(3)"</span>
<span class='linenumber'> 43 </span><span class=
'keyword'>    assert</span> str(a*b) ==<span class='string'> "(3/2)"</span>
<span class='linenumber'> 44 </span>    c = Bruch(<span class=
'number'>1</span>,<span class='number'> 3</span>)
<span class='linenumber'> 45 </span><span class=
'keyword'>    assert</span> str(b*c) ==<span class='string'> "(1)"</span>
<span class='linenumber'> 46 </span>    d = Bruch(<span class=
'number'>5</span>,<span class='number'> 10</span>)
<span class='linenumber'> 47 </span><span class=
'keyword'>    assert</span> str(d) ==<span class='string'> "(1/2)"</span>
<span class='linenumber'> 48 </span><span class=
'keyword'>    assert</span> str(a/b) ==<span class='string'> "(1/6)"</span>
<span class='linenumber'> 49 </span><span class=
'keyword'>    assert</span> str(a/a) ==<span class='string'> "(1)"</span>
<span class='newlinenumber'> 50 </span><span class=
'keyword'>    assert</span> str(a+a) ==<span class='string'> "(1)"</span>
<span class='newlinenumber'> 51 </span><span class=
'keyword'>    assert</span> str(b+b) ==<span class='string'> "(6)"</span>
<span class='newlinenumber'> 52 </span><span class=
'keyword'>    assert</span> str(a+b) ==<span class='string'> "(7/2)"</span>
<span class='newlinenumber'> 53 </span><span class=
'keyword'>    assert</span> str(c+c) ==<span class='string'> "(2/3)"</span>
</pre>
<p>Und hier ist die notwendige Erweiterung der Klasse <tt>Bruch</tt>:</p>
<pre>
<span class='newlinenumber'> 29 </span>    <span class=
'keyword'>def</span> __add__(self, operand):
<span class='newlinenumber'> 30 </span>        nenner = self.nenner * operand.nenner
<span class='newlinenumber'> 31 </span>        zaehler = self.zaehler*operand.nenner + self.nenner*operand.zaehler
<span class='newlinenumber'> 32 </span><span class=
'keyword'>        return</span> Bruch(zaehler, nenner)
</pre>
<p>Probier's aus!</p>
<!--=============================================-->
<hr class="line" />
<h3 class="try">Du bist dran.</h3>
<p>Du solltest jetzt auch in der Lage sein, Brüche zu subtrahieren. Verwende 
dazu die Methode <tt>__sub__()</tt> und überprüfe deine Ergebnisse!</p>
<!--=============================================-->
<hr class="line" />
<h3 class="section">1 + 1 = ?</h3>
<p>Bevor wir mit der nächsten Lektion weitermachen, probiere folgendes aus:</p>
<pre>
eins = Bruch(1)
<span class="keyword">print</span> eins + 1
</pre>

<div class="lessons_toc">
<a href="45-fractions2.htm"><img alt="previous" src=
"../../images/previous.png"/>45. Brüche - Teil 2</a> - 
<a href="../lessons_toc.htm"><img alt="home" src="../../images/home.png"/>
</a> - <a href="47-fractions4.htm">47. Brüche - Teil 4<img alt="next"
src="../../images/next.png"/></a>
</div>
</body>
</html>
